/**
 * @Author: 罗显
 * @CreateTime: 2025-05-08
 * @Version: 1.0
 */


package com.it.dataservice.user.entity;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Data;

import java.util.Date;

@Data
public class UserEntity {
    /*
     *name 用户名
     * password 密码
     * nickname 昵称
     * image 头像
     * email 邮箱
     * phone 手机号
     * createTime 创建时间
     * updateTime 更新时间
     * *****/
    private Long id;
    private String name;
    private String password;
    private String nickname;
    private String image;
    private String email;
    private String phone;
    private UserStatus userStatus;

    private Date createTime;
    private Date updateTime;

    public enum UserStatus {
        INACTIVE(0, "未激活"), // 未激活
        ACTIVE(1, "已激活");  // 已激活


        private final int code;
        private final String description;

        UserStatus(int code, String description) {
            this.code = code;
            this.description = description;
        }

        /**
         * `@JsonValue` 注解
         * <p>
         * 作用：告诉 Jackson 在序列化 UserStatus 枚举时，使用 getCode() 方法的返回值。
         * 序列化指的是将 Java 对象转换为 JSON 字符串的过程。
         * <p>
         * 示例：
         * 当 UserEntity 对象的 userStatus 字段为 UserStatus.LOCKED 时，
         * 序列化为 JSON 后，该字段的值将是 -1 （LOCKED 的 code 值），而不是 "LOCKED" 或其索引值。
         */
        @JsonValue
        public int getCode() {
            return code;
        }

        public String getDescription() {
            return description;
        }

        /**
         * `@JsonCreator` 注解
         * <p>
         * 作用：告诉 Jackson 在反序列化 UserStatus 枚举时，使用 fromCode() 方法来将 JSON 中的值转换为 UserStatus 枚举对象。
         * 反序列化指的是将 JSON 字符串转换为 Java 对象的过程。
         * <p>
         * 示例：
         * 当 JSON 字符串中 UserEntity 对象的 userStatus 字段的值为 -1 时，
         * Jackson 会调用 fromCode(-1) 方法来获取对应的 UserStatus 枚举对象（UserStatus.LOCKED）。
         */
        @JsonCreator
        public static UserStatus fromCode(int code) {
            for (UserStatus status : UserStatus.values()) {
                if (status.code == code) {
                    return status;
                }
            }
            throw new IllegalArgumentException("无效的用户状态代码: " + code);
        }
    }
}